using namespace std;

#include "ActualizadorJugadores.h"

ActualizadorJugadores::ActualizadorJugadores(bool atributo) : Thread(atributo){
};

ActualizadorJugadores::~ActualizadorJugadores() {
	free(this);
};

//Manejador de señales de interrupcion.
void ActualizadorJugadores::signalHandler(int signal){
	if( signal == SIGIO){
		//Informo la finalizacion por sysout
		cout<< "[INFO] - Se cierra el hilo actualizador de rankings. "<< endl;
		//Cierro el thread.
		pthread_exit(NULL);
	}
}
//Metodo ejecutor del thread
void ActualizadorJugadores::run (){
	/* Me attacho a la señal que envia el server para finalizar. */
	signal(SIGFPE, ActualizadorJugadores::signalHandler);
	signal(SIGILL, ActualizadorJugadores::signalHandler);
	signal(SIGURG, ActualizadorJugadores::signalHandler);
	signal(SIGABRT, ActualizadorJugadores::signalHandler);
	signal(SIGCLD, ActualizadorJugadores::signalHandler);
	signal(SIGQUIT, ActualizadorJugadores::signalHandler);
	signal(SIGIO,  ActualizadorJugadores::signalHandler);

	/* Mientras la partida este activa */
	while (Partida::getInstance()->isActivo()) {
		/* Si no esta parada la partida ejecuto la actualizacion */
		if(!(Partida::getInstance()->isStoped())){
			//Le indico al juego que actualice el ranking de los jugadores de la partida.
			Partida::getInstance()->refreshStatsJugadores(CONST_FALSE,CONST_TRUE);
			//Doy un lapso de medio segundo para seguir.
			usleep(500000);
		}
	}

	//Cierro el thread.
	pthread_exit(NULL);
}
	
